#include "system.h"
#include "fingerprint.h"
#include "password.h"
#include "rfid.h"
#include "motor.h"
#include "oled.h"
#include "power_mgmt.h"
#include "menu.h"

// 系统状态
static SystemMode currentMode = MODE_NORMAL;
static bool isInitialized = false;

// 低电量回调函数
static void LowBatteryCallback(void)
{
    OLED_ShowString(0, 0, "Low Battery!");
    OLED_Refresh();
    POWER_EnterLowPowerMode();
}

// 菜单超时回调函数
static void MenuTimeoutCallback(void)
{
    MENU_Back();
    if (POWER_GetState() == POWER_STATE_NORMAL) {
        POWER_EnterLowPowerMode();
    }
}

// 系统初始化
static SystemStatus SystemInit(void)
{
    SystemStatus status;

    // 初始化各个模块
    status = POWER_Init();
    if (status != SYSTEM_OK) return status;

    status = OLED_Init();
    if (status != SYSTEM_OK) return status;

    status = MOTOR_Init();
    if (status != SYSTEM_OK) return status;

    status = FP_Init();
    if (status != SYSTEM_OK) return status;

    status = PWD_Init();
    if (status != SYSTEM_OK) return status;

    status = RFID_Init();
    if (status != SYSTEM_OK) return status;

    status = MENU_Init();
    if (status != SYSTEM_OK) return status;

    // 注册回调函数
    POWER_RegisterLowBatteryCallback(LowBatteryCallback);
    MENU_SetTimeoutCallback(MenuTimeoutCallback);

    return SYSTEM_OK;
}

int main(void)
{
    // 系统初始化
    if (SystemInit() != SYSTEM_OK) {
        // 初始化失败处理
        while (1) {
            // 显示错误信息
            OLED_ShowString(0, 0, "Init Failed!");
            OLED_Refresh();
        }
    }

    isInitialized = true;

    // 主循环
    while (1) {
        // 更新菜单定时器
        MENU_TimerUpdate();

        // 检查电源状态
        if (POWER_GetState() == POWER_STATE_LOW_BATTERY) {
            LowBatteryCallback();
            continue;
        }

        // 根据当前模式执行相应操作
        switch (currentMode) {
            case MODE_NORMAL:
                // 正常模式下的操作
                MENU_Display();
                break;

            case MODE_ADMIN:
                // 管理员模式下的操作
                MENU_Display();
                break;

            case MODE_POWER_SAVE:
                // 省电模式下的操作
                if (POWER_GetState() == POWER_STATE_NORMAL) {
                    POWER_EnterLowPowerMode();
                }
                break;

            default:
                break;
        }
    }
} 